#ifndef __STEPMOTOR_TEST_H
#define __STEPMOTOR_TEST_H

/* 包含头文件 ----------------------------------------------------------------*/
#include <stm32f10x.h>

#define TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
(*(__IO uint32_t *)(&((__HANDLE__)->CCR1) + ((__CHANNEL__) >> 2U)) = (__COMPARE__))


#define TRUE                                   1
#define FALSE                                  0


// 定义定时器预分频，定时器实际时钟频率为：168MHz/（STEPMOTOR_TIMx_PRESCALER+1）
#define STEPMOTOR_TIM_PRESCALER               159 // 步进电机驱动器细分设置为：  


// 定义定时器周期，输出比较模式周期设置为0xFFFF
#define STEPMOTOR_TIM_PERIOD                   0xFFFF
// 定义高级定时器重复计数寄存器值
#define STEPMOTOR_TIM_REPETITIONCOUNTER       0

#define T1_FREQ                               (SystemCoreClock/(STEPMOTOR_TIM_PRESCALER+1)) // 频率ft值
#define FSPR                                  200         //步进电机单圈步数
#define MICRO_STEP                            32          // 步进电机驱动器细分数

#define ROUNDPS_2_STEPPS(RPM)                 ((RPM) * FSPR * MICRO_STEP / 60)         // 根据电机转速（r/min），计算电机步速（step/s）
#define MIDDLEVELOCITY(Vo,Vt)                 ( ( (Vo) + (Vt) ) / 2 )                  // S型加减速加速段的中点速度 
#define INCACCEL(Vo,V,T)                      ( ( 2 * ((V) - (Vo)) ) / pow((T),2) )    // 加加速度:加速度增加量   V - V0 = 1/2 * J * t^2
#define INCACCELSTEP(J,T)                     ( ( (J) * pow( (T) , 3 ) ) / 6 )         // 加加速段的位移量(步数)  S = 1/6 * J * t^3
#define ACCEL_TIME(T)                         ( (T) / 2 )                              // 加加速段和减加速段的时间是相等的

#define SPEED_MIN                              (T1_FREQ / (65535.0f))// 最低频率/速度


enum MotorStatus
{
    STOP = 0,   //  电机状态标记: 停止
    ACCEL = 1,   //  电机状态标记: 加速
    AVESPEED = 2,   //  电机状态标记: 匀速
    DECEL = 3,   //  电机状态标记: 减速
    WAIT = 4   //  电机状态标记: 待机
};


typedef struct {
    int32_t   Vo;               // 初速度   单位 Step/s
    int32_t   Vt;               // 末速度   单位 Step/s
    int32_t AccelStep;          // 加速段的步数 单位 Step
    int32_t DecelStep;          // 加速段的步数 单位 Step
    float* AccelTab;            // 速度表格 单位 Step/s  步进电机的脉冲频率
    float* DecelTab;            // 速度表格 单位 Step/s  步进电机的脉冲频率
    float* SpeedTab;
    float* ptr;                 // 速度指针
    int32_t DecPoint;           // 减速点
    int32_t Step;
    int32_t Step_Position;      //
}SpeedCalc_TypeDef;


enum BufferState
{
    IDLE,       //空闲
    WRITING,    //正在写
    READING,    //正在读
    FULL,       //已写满
    WRITEOVER   //写完成（没有完全写满）
};
#define MAX_BUFF_SIZE 512
typedef struct {
    float Buffer[2][MAX_BUFF_SIZE];
    uint16_t BuffWriteIndex;    // 缓冲区写索引    
    uint8_t WriteIndex;      // 空闲的缓冲区索引
    uint8_t ReadIndex;      // 缓冲区是否有数据可读
    enum BufferState BufferState[2];
}StepBuffer_TypeDef;


/* 类型定义 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/
#define TB6600_TIMx                        TIM5
#define TB6600_TIM_APBxClock_FUN           RCC_APB1PeriphClockCmd
#define TB6600_TIM_CLK                     RCC_APB1Periph_TIM5
#define TB6600_TIM_CHANNEL_x               TIM_Channel_2

#define TB6600_TIM_GPIO_APBxClock_FUN      RCC_APB2PeriphClockCmd
#define TB6600_TIM_GPIO_CLK                RCC_APB2Periph_GPIOA
#define TB6600_TIM_CH1_PORT                GPIOA                 // 对应TB6600的PUL-，
#define TB6600_TIM_CH1_PIN                 GPIO_Pin_1            // 而PLU+直接接开发板的+5V(或者3.3V)

#define TB6600_DIR_GPIO_CLK                RCC_APB2Periph_GPIOF  // 电机旋转方向控制
#define TB6600_DIR_PORT                    GPIOF                 // 对应TB6600的DIR-，
#define TB6600_DIR_PIN                     GPIO_Pin_2            // 而DIR+直接接开发板的+5V(或者3.3V)

#define TB6600_ENA_GPIO_CLK                RCC_APB2Periph_GPIOF  // 电机使能控制，该引脚可不接悬空
#define TB6600_ENA_PORT                    GPIOF                 // 对应TB6600的ENA-，
#define TB6600_ENA_PIN                     GPIO_Pin_3            // 而ENA+直接接开发板的+5V(或者3.3V)


#define STEPMOTOR_DIR_FORWARD()               GPIO_SetBits(TB6600_DIR_PORT,TB6600_DIR_PIN)
#define STEPMOTOR_DIR_REVERSAL()              GPIO_ResetBits(TB6600_DIR_PORT,TB6600_DIR_PIN)

#define STEPMOTOR_OUTPUT_ENABLE()             GPIO_ResetBits(TB6600_ENA_PORT,TB6600_ENA_PIN)
#define STEPMOTOR_OUTPUT_DISABLE()            GPIO_SetBits(TB6600_ENA_PORT,TB6600_ENA_PIN)


/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void TB6600_TIMx_PWM_Init(void);
void StepMotor_Test(void);



#define M0_EN_PORT          GPIOF
#define M0_EN_PIN           GPIO_Pin_3
#define M0_DIR_PORT         GPIOF
#define M0_DIR_PIN          GPIO_Pin_2
#define M0_STEP_PORT        GPIOA
#define M0_STEP_PIN         GPIO_Pin_1
#endif


